package daily;

import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
import java.util.function.BiConsumer;

/**
 * @author MtRider
 * @version 1.0
 * @description 只出现一次的数字
 * 输入: [2,2,1]
 * 输出: 1
 * @GiteeAndGithub MtRider
 * @date 2022/4/22 20:32
 */
public class demo05 {

    public static void main(String[] args) {
        int[] nums = {4, 1, 2, 1, 2};
        System.out.println(singleNumber3(nums));

    }

    //通过HashSet接收值，放入次数
    public static int singleNumber(int[] nums) {
        int temp = -1;
        Map<Integer, Integer> map = new HashMap<>();
        for (int num : nums) {
            map.merge(num, 1, Integer::sum);
        }
        for (Map.Entry<Integer, Integer> entry : map.entrySet()) {
            if (entry.getValue() == 1) {
                temp = entry.getKey();
            }
        }
        return temp;
    }

    //set 添加false去重 返回一个值
    public int singleNumber2(int[] nums) {
        Set<Integer> set = new HashSet<>();
        for (int num : nums) {
            if (!set.add(num)) {
                //如果添加失败，说明这个值
                //在集合Set中存在，我们要
                //把他给移除掉
                set.remove(num);
            }
        }
        //最终集合Set中只有一个元素，我们直接返回
        return (int) set.toArray()[0];
    }

    //使用异或运算

    /**
     * 1^1=0;
     * 1^0=1;
     * 0^1=1;
     * 0^0=0;
     * 也就说0和1异或的时候相同的异或结果为0，不同的异或结果为1，
     * @param nums
     * @return
     */
    public static int singleNumber3(int[] nums) {
        int result = 0;
        for (int num : nums) {
            result = result ^ num;
        }
        return result;
    }
}
